import type { RequestConfig } from "@/api/api";
import axios, { AxiosError, type AxiosRequestConfig } from "axios";
import { useUserStore } from '@/stores/user'


// 创建 axios 实例
const service = axios.create({
    baseURL: import.meta.env.HG_API_BASE_URL,
    timeout: 10000,
    headers: {
        'Content-Type': 'application/json;charset=utf-8'
    }
})
// 请求队列
const pendingMap = new Map<string, AbortController>()
// 生成请求 key
const generateReqKey = (config: AxiosRequestConfig): string => {
    const { method, url, params, data } = config
    return [method, url, JSON.stringify(params), JSON.stringify(data)].join('&')
}
// 添加请求到队列
const addPendingRequest = (config: AxiosRequestConfig) => {
    const key = generateReqKey(config)
    if (!pendingMap.has(key)) {
        const controller = new AbortController()
        config.signal = controller.signal
        pendingMap.set(key, controller)
    } else {
        config.signal = pendingMap.get(key)?.signal
    }
}
// 从队列中移除请求
const removePendingRequest = (config: AxiosRequestConfig) => {
    const key = generateReqKey(config)
    if (pendingMap.has(key)) {
        pendingMap.delete(key)
    }
}

// 请求拦截器
service.interceptors.request.use(
    (config: RequestConfig) => {
        removePendingRequest(config)
        addPendingRequest(config)

        // 添加 token
        const userStore = useUserStore()
        if (userStore.token) {
            config.headers = config.headers || {}
            config.headers.Authorization = `Bearer ${userStore.token}`
        }

        // 如果需要请求显示 loading 状态，则显示 loading 组件
        // if (config.showLoading) {
        //     config.loadingInstance = ElLoading.service({
        //         lock: true,
        //         text: '加载中...',
        //         background: 'rgba(0, 0, 0, 0.7)'
        //     })
        // }

        return config
    },
    (error: AxiosError) => {
        return Promise.reject(error)
    }
)
// 响应 拦截器
service.interceptors.response.use(
    (res) => {
        return res.data;
    },
    (err) => {
        return Promise.resolve(err);
    },
);

/**
 * 封装请求方法
 * @param config 请求配置
 */
export function request<T = any>(config: RequestConfig): Promise<T> {
    return service(config)
}

/**
* 封装 GET 请求
* @param url 请求地址
* @param params 请求参数
* @param config 请求配置
*/
export function get<T = any>(
    url: string,
    params?: any,
    config?: RequestConfig
): Promise<T> {
    return request({ ...config, url, params, method: 'GET' })
}
/**
 * 封装 POST 请求
 * @param url 请求地址
 * @param data 请求数据
 * @param config 请求配置
 */
export function post<T = any>(
    url: string,
    data?: any,
    config?: RequestConfig
): Promise<T> {
    return request({ ...config, url, data, method: 'POST' })
}
export default service